/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package pe.edu.upc.sad.dao;

import java.awt.Color;
import java.util.List;
import java.util.ArrayList;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import pe.edu.upc.sad.model.Empresa;
import pe.edu.upc.sad.model.EmpresaArea;
import pe.edu.upc.sad.model.MensajeResultado;
import pe.edu.upc.sad.model.Reserva;
import pe.edu.upc.sad.model.Usuario;
import pe.edu.upc.sad.util.BError;
import pe.edu.upc.sad.util.Conexion;
import pe.edu.upc.sad.util.ToolSql;
import pe.edu.upc.sad.util.UFecha;
/**
 *
 * @author aalanya
 */
public class ReservaDaoImpl implements ReservaDao
{

    private Statement  st   = null;
    private ResultSet  rs   = null;
    private CallableStatement stmt =null;
    private StringBuffer query = null;
    Connection conn = null;
    private BError error;

    public ReservaDaoImpl()
    {
     
    }
    public void Inicio()
    {
       error = new BError();
       query = new StringBuffer("");
       conn =   Conexion.getConnection();
    }

    public String Color()
    {
        Random random = new Random();
        Color randomColor = Color.getHSBColor( random.nextFloat(), 1.0F, 1.0F );
        String rgb = Integer.toHexString(randomColor.getRGB());
        rgb = rgb.substring(2, rgb.length());
        rgb =  "#" + rgb.toString();
        return rgb;
    }

    @Override
    public List<Reserva> getListReservaByAreaEmpresa(int id_AreaEmpresa) throws Exception
    {

     List<Reserva> lstReserva =null;
        try
        {
            /* generar color */
            Inicio();
            lstReserva = new ArrayList<Reserva>();
            query.append("{ call USP_SELECT_RESERVABYAREA( ? ) }");
            stmt = conn.prepareCall(query.toString());
            stmt.setInt( 1, id_AreaEmpresa );

            stmt.execute();
            rs = stmt.getResultSet();

            Reserva reserva = null;
            EmpresaArea empresaarea = null;
            Usuario user = null;
            while (rs.next())
            {
              empresaarea = new EmpresaArea();
              empresaarea.setIdEmpresaArea(rs.getInt("IdEmpresaArea"));
              empresaarea.setNombre(rs.getString("Nombre"));
              empresaarea.setDescripcion( rs.getString("Descripcion"));
              empresaarea.setImagen(rs.getString("Imagen"));
              empresaarea.setPrecio(rs.getDouble("Precio"));
              empresaarea.setDireccion(rs.getString("Direccion"));

              user = new Usuario();
              user.setNombres(rs.getString("Nombres"));
              user.setDni(rs.getString("Dni"));
              user.setApellidos(rs.getString("Apellidos"));

              reserva = new Reserva();
              reserva.setIdReserva(rs.getInt("IdReserva"));
              reserva.setFechaDesde(rs.getString("FechaDesde"));
              reserva.setFechaHasta(rs.getString("FechaHasta"));
              reserva.setFechaRegistro(rs.getDate("FechaRegistro"));
              reserva.setEstado(rs.getString("Estado"));
              reserva.setTotal(rs.getDouble("Total"));
              reserva.setDetalle(rs.getString("Detalle"));
              reserva.setUsuario(user);
              reserva.setEmpresaarea(empresaarea);
              reserva.setColor("#" + rs.getString("Color"));
              lstReserva.add(reserva);
            }

            return  lstReserva;
        }catch(Exception e)
        {
            error.setCodError(100);
            error.setMsgError("Error :" + e.getMessage());
             lstReserva = new ArrayList<Reserva>();
             return  lstReserva;
        }
        finally
        {
             ToolSql.close(rs, st, stmt, conn);
        }

    }
    
    @Override
    public MensajeResultado UpdateFechas(Reserva reserve) throws SQLException
    {
       int resultado = 0;
        MensajeResultado oResultado =   new MensajeResultado();
       try
        {
          Inicio();
          query.append("{ call USP_UPDATE_RESERVAFECHA( ?, ?, ? ) }");
          stmt = conn.prepareCall(query.toString());
          stmt.setInt(1,reserve.getIdReserva());
          stmt.setString(2,reserve.getFechaDesde());
          stmt.setString(3,reserve.getFechaHasta());
          stmt.execute();

            oResultado.setESTADO(1);
            oResultado.setMENSAJE("Se actualizo correctamente.");
            oResultado.setID_RETURN("1");
            oResultado.setTIPO_RETURN("1");
            oResultado.setDETALLE("");

        }
        catch(Exception e)
        {
            error.setCodError(100);
            error.setMsgError("Error :" + e.getMessage());
            oResultado.setESTADO(0);
            oResultado.setMENSAJE("Se produjo un Error.");
            oResultado.setID_RETURN("1");
            oResultado.setTIPO_RETURN("1");
            oResultado.setDETALLE("Error :" + e.getMessage());
        }
        finally
        {
          //ToolSql.close(null,null,stmt,null );
           ToolSql.close(rs, st, stmt, conn);
        }
        return oResultado;
  }

    @Override
    public MensajeResultado DeleteReserva(int Idreserva) throws SQLException
    {
       int resultado = 0;
        MensajeResultado oResultado =   new MensajeResultado();
       try
        {
          Inicio();
          query.append("{ call USP_DELETE_RESERVABYID( ? ) }");
          stmt = conn.prepareCall(query.toString());
          stmt.setInt(1,Idreserva);

          stmt.execute();
            oResultado.setESTADO(1);
            oResultado.setMENSAJE("Se Elimino correctamente.");
            oResultado.setID_RETURN("1");
            oResultado.setTIPO_RETURN("1");
            oResultado.setDETALLE("");

        }
        catch(Exception e)
        {
            error.setCodError(100);
            error.setMsgError("Error :" + e.getMessage());
            oResultado.setESTADO(0);
            oResultado.setMENSAJE("Se produjo un Error.");
            oResultado.setID_RETURN("1");
            oResultado.setTIPO_RETURN("1");
            oResultado.setDETALLE("Error :" + e.getMessage());
        }
        finally
        {
          //ToolSql.close(null,null,stmt,null );
           ToolSql.close(rs, st, stmt, conn);
        }
        return oResultado;
  }

    @Override
    public MensajeResultado InsertReserva(Reserva reserve,int horas) throws SQLException
    {
       int resultado = 0;
        MensajeResultado oResultado =   new MensajeResultado();
       try
        {
          Inicio();
//  P_FechaDesde    VARCHAR(50),
//  P_FechaHasta    VARCHAR(50),
//  P_Dni           char(8),
//  P_Estado        char(1),
//  P_IdEmpresaArea int,
//  P_Total         double(15,2),
//  P_Detalle       varchar(500)
          query.append("{ call USP_INSERT_RESERVA( ?, ?, ?, ?, ?, ?, ? ) }");
          stmt = conn.prepareCall(query.toString());
          stmt.setString(1,reserve.getFechaDesde());
          stmt.setString(2,reserve.getFechaHasta());
          stmt.setString(3,reserve.getUsuario().getDni());
          stmt.setString(4,"1");
          stmt.setInt(5,reserve.getEmpresaarea().getIdEmpresaArea());
          stmt.setDouble(6,horas);
          stmt.setString(7,reserve.getDetalle());
          stmt.execute();
            rs = stmt.getResultSet();

            int result = 0;
            
            while (rs.next())
            {
              result = rs.getInt("resultado");
            }
            if(result == 1)
            {
                oResultado.setESTADO(result);
                oResultado.setMENSAJE("Se Registro la Reserva correctamente.");
                oResultado.setID_RETURN("1");
                oResultado.setTIPO_RETURN("1");
                oResultado.setDETALLE("");
            }
            else if(result == 2)
            {
                oResultado.setESTADO(result);
                oResultado.setMENSAJE("Existe una reserva en ese horario. Cambiar fecha!");
                oResultado.setID_RETURN("1");
                oResultado.setTIPO_RETURN("1");
                oResultado.setDETALLE("");
            }else
            {
                 oResultado.setESTADO(0);
                oResultado.setMENSAJE("Se produjo un Error.");
                oResultado.setID_RETURN("1");
                oResultado.setTIPO_RETURN("1");
                oResultado.setDETALLE("");
            }
        }
        catch(Exception e)
        {
            error.setCodError(100);
            error.setMsgError("Error :" + e.getMessage());
            oResultado.setESTADO(0);
            oResultado.setMENSAJE("Se produjo un Error.");
            oResultado.setID_RETURN("1");
            oResultado.setTIPO_RETURN("1");
            oResultado.setDETALLE("Error :" + e.getMessage());
        }
        finally
        {
          //ToolSql.close(null,null,stmt,null );
           ToolSql.close(rs, st, stmt, conn);
        }
        return oResultado;
  }

    @Override
    public MensajeResultado UpdateReserva(Reserva reserve,int horas) throws SQLException
    {
       int resultado = 0;
        MensajeResultado oResultado =   new MensajeResultado();
       try
        {
          Inicio();
//  P_FechaDesde    VARCHAR(50),
//  P_FechaHasta    VARCHAR(50),
//  P_Dni           char(8),
//  P_Estado        char(1),
//  P_IdEmpresaArea int,
//  P_Total         double(15,2),
//  P_Detalle       varchar(500)
          query.append("{ call USP_UPDATE_RESERVA( ?, ?, ?, ?, ?, ?, ?, ? ) }");
          stmt = conn.prepareCall(query.toString());
          stmt.setString(1,reserve.getFechaDesde());
          stmt.setString(2,reserve.getFechaHasta());
          stmt.setString(3,reserve.getUsuario().getDni());
          stmt.setString(4,"1");
          stmt.setInt(5,reserve.getEmpresaarea().getIdEmpresaArea());
          stmt.setDouble(6,horas);
          stmt.setString(7,reserve.getDetalle());
          stmt.setInt(8,reserve.getIdReserva());

          stmt.execute();
            rs = stmt.getResultSet();

            int result = 0;

            while (rs.next())
            {
              result = rs.getInt("resultado");
            }
            if(result == 1)
            {
                oResultado.setESTADO(result);
                oResultado.setMENSAJE("Se Actualizo la Reserva correctamente.");
                oResultado.setID_RETURN("1");
                oResultado.setTIPO_RETURN("1");
                oResultado.setDETALLE("");
            }
            else if(result == 2)
            {
                oResultado.setESTADO(result);
                oResultado.setMENSAJE("Existe una reserva en ese horario. Cambiar fecha!");
                oResultado.setID_RETURN("1");
                oResultado.setTIPO_RETURN("1");
                oResultado.setDETALLE("");
            }else
            {
                 oResultado.setESTADO(0);
                oResultado.setMENSAJE("Se produjo un Error.");
                oResultado.setID_RETURN("1");
                oResultado.setTIPO_RETURN("1");
                oResultado.setDETALLE("");
            }
        }
        catch(Exception e)
        {
            error.setCodError(100);
            error.setMsgError("Error :" + e.getMessage());
            oResultado.setESTADO(0);
            oResultado.setMENSAJE("Se produjo un Error.");
            oResultado.setID_RETURN("1");
            oResultado.setTIPO_RETURN("1");
            oResultado.setDETALLE("Error :" + e.getMessage());
        }
        finally
        {
          //ToolSql.close(null,null,stmt,null );
           ToolSql.close(rs, st, stmt, conn);
        }
        return oResultado;
  }

     @Override
    public MensajeResultado UpdateReservaConfirmado(int idreserva,String idestado) throws SQLException
    {
       int resultado = 0;
        MensajeResultado oResultado =   new MensajeResultado();
       try
        {
          Inicio();

          query.append("{ call USP_UPDATE_CONFIRMAR( ?, ?  ) }");
          stmt = conn.prepareCall(query.toString());
          stmt.setString(1,idestado);
          stmt.setInt(2,idreserva);

          stmt.execute();

            oResultado.setESTADO(1);
            oResultado.setMENSAJE("Se Confirmo la Reserva correctamente.");
            oResultado.setID_RETURN("1");
            oResultado.setTIPO_RETURN("1");
            oResultado.setDETALLE("");

        }
        catch(Exception e)
        {
            error.setCodError(100);
            error.setMsgError("Error :" + e.getMessage());
            oResultado.setESTADO(0);
            oResultado.setMENSAJE("Se produjo un Error.");
            oResultado.setID_RETURN("1");
            oResultado.setTIPO_RETURN("1");
            oResultado.setDETALLE("Error :" + e.getMessage());
        }
        finally
        {
          //ToolSql.close(null,null,stmt,null );
           ToolSql.close(rs, st, stmt, conn);
        }
        return oResultado;
  }

    @Override
    public List<Reserva> getListReservaByEstado(int id_estado,String id_idempresa) throws Exception
    {

     List<Reserva> lstReserva =null;
        try
        {
            /* generar color */
            Inicio();
            lstReserva = new ArrayList<Reserva>();
            query.append("{ call USP_SELECT_RESERVABYESTADO( ?,? ) }");
            stmt = conn.prepareCall(query.toString());
            stmt.setInt( 1, id_estado );
            stmt.setString( 2, id_idempresa );

            stmt.execute();
            rs = stmt.getResultSet();

            Reserva reserva = null;
            EmpresaArea empresaarea = null;
            Usuario user = null;
            while (rs.next())
            {
              empresaarea = new EmpresaArea();
              empresaarea.setIdEmpresaArea(rs.getInt("IdEmpresaArea"));
              empresaarea.setNombre(rs.getString("Nombre"));
              empresaarea.setDescripcion( rs.getString("Descripcion"));
              empresaarea.setImagen(rs.getString("Imagen"));
              empresaarea.setPrecio(rs.getDouble("Precio"));
              empresaarea.setDireccion(rs.getString("Direccion"));

              user = new Usuario();
              user.setNombres(rs.getString("Nombres"));
              user.setDni(rs.getString("Dni"));
              user.setApellidos(rs.getString("Apellidos"));

              reserva = new Reserva();
              reserva.setIdReserva(rs.getInt("IdReserva"));
              reserva.setFechaDesde(rs.getString("FechaDesde"));
              reserva.setFechaHasta(rs.getString("FechaHasta"));
              reserva.setFechaRegistro(rs.getDate("FechaRegistro"));
              reserva.setEstado(rs.getString("Estado"));
              reserva.setTotal(rs.getDouble("Total"));
              reserva.setDetalle(rs.getString("Detalle"));
              reserva.setUsuario(user);
              reserva.setEmpresaarea(empresaarea);
              reserva.setColor("#" + rs.getString("Color"));
              lstReserva.add(reserva);
            }

            return  lstReserva;
        }catch(Exception e)
        {
            error.setCodError(100);
            error.setMsgError("Error :" + e.getMessage());
             lstReserva = new ArrayList<Reserva>();
             return  lstReserva;
        }
        finally
        {
             ToolSql.close(rs, st, stmt, conn);
        }

    }

    public Reserva get(int idReserva, Connection conn) throws Exception
    {
        Reserva reserve = null;
        Usuario user = null;
        Empresa company = null;
        EmpresaArea areaCompany = null;

     try{

        query.append("{ call USP_SELECT_RESERVA( ? ) }");

        stmt = conn.prepareCall(query.toString());

        stmt.setInt( 1, idReserva );

        stmt.execute();

        rs = stmt.getResultSet();

        while (rs.next())
        {
          reserve = new Reserva();
          user = new Usuario();
          company = new Empresa();
          areaCompany = new EmpresaArea();

          user.setDni(rs.getString("Dni"));
          user.setNombres(rs.getString("Nombre"));

          reserve.setEstado(rs.getString("Estado"));

          company.setRazonSocial(rs.getString("RazonSocial"));

//          reserve.setFechaDesde(rs.getTimestamp("FechaDesde")) ;
//          reserve.setFechaDesde(rs.getTimestamp("FechaHasta")) ;
          reserve.setFechaRegistro(rs.getTimestamp("FechaRegistro"));

          areaCompany.setEmpresa(company);

          reserve.setUsuario(user);
          reserve.setEmpresaarea(areaCompany);
          
        }

    }catch (Exception e){
        error.setCodError(100);
        error.setMsgError("Error :" + e.getMessage());
    }finally{
        ToolSql.close(rs, st, null, null);
    }
        return reserve;
   }

    public List getListReserveByUser(String dni, Connection conn) throws Exception
    {
        Reserva reserve = null;
        Usuario user = null;
        Empresa company = null;
        EmpresaArea areaCompany = null;

        List lstReserve = new ArrayList();
     try{

        query.append("{ call USP_SELECT_RESERVA( ? ) }");

        stmt = conn.prepareCall(query.toString());

        stmt.setString( 1, dni );

        stmt.execute();

        rs = stmt.getResultSet();

        while (rs.next())
        {
          reserve = new Reserva();
          user = new Usuario();
          company = new Empresa();
          areaCompany = new EmpresaArea();

          user.setDni(rs.getString("Dni"));
          user.setNombres(rs.getString("Nombre"));

          reserve.setEstado(rs.getString("Estado"));

          company.setRazonSocial(rs.getString("RazonSocial"));

//          reserve.setFechaDesde(rs.getTimestamp("FechaDesde")) ;
//          reserve.setFechaDesde(rs.getTimestamp("FechaHasta")) ;
          reserve.setFechaRegistro(rs.getTimestamp("FechaRegistro"));

          areaCompany.setEmpresa(company);

          reserve.setUsuario(user);
          reserve.setEmpresaarea(areaCompany);

          lstReserve.add(reserve);
        }

    }catch (Exception e){
        error.setCodError(100);
        error.setMsgError("Error :" + e.getMessage());
    }finally{
        ToolSql.close(rs, st, null, null);
    }
        return lstReserve;
   }

     public int insert (Reserva reserve, Connection conn) throws SQLException
  {
   int resultado = 0;
   try
    {

      query.append("{ call USP_INSERT_RESERVA( ?, ?, ?, ?, ?, ?, ? ) }");

      stmt = conn.prepareCall(query.toString());

      stmt.setInt(1,reserve.getIdReserva());
//      stmt.setTimestamp(2, new Timestamp(reserve.getFechaDesde().getTime()));
//      stmt.setTimestamp(3, new Timestamp(reserve.getFechaHasta().getTime()) );
      stmt.setString(4,reserve.getUsuario().getDni());
      stmt.setString(5,reserve.getEstado());
      stmt.setInt(6, reserve.getEmpresaarea().getIdEmpresaArea());
      stmt.setTimestamp(7, UFecha.getPresentDate());

      stmt.execute();

      resultado = 1;//stmt.getInt(32);

    }
    catch(Exception e)
    {
        error.setCodError(100);
        error.setMsgError("Error :" + e.getMessage());
    }
    finally
    {
      ToolSql.close(null,null,stmt,null );
    }
    return resultado;
  }


}
